package es.ucm.fdi.pe.practica2.genetico2.cruce;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;

import es.ucm.fdi.pe.practica2.genetico2.Alumno;
import es.ucm.fdi.pe.practica2.genetico2.CromosomaAlumnos;

//3 alumnos aleatorios
//CruceOX por orden prioritario

public class CruceOXOrdenPrioritario {
	
	public void cruce (CromosomaAlumnos c1, CromosomaAlumnos c2){
		ArrayList<Alumno> alumnosAleatorios = new ArrayList<Alumno>();
		int[] posicionesAleatorias = new int[3];
		LinkedList<Integer> indices1 = new LinkedList<Integer>() ;
		LinkedList<Integer> indices2 = new LinkedList<Integer>();
		
		posicionesAleatorias[0]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
		
		do{
			posicionesAleatorias[1]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
		}while(posicionesAleatorias[1]==posicionesAleatorias[0]);
		
		do{
			posicionesAleatorias[2]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
		}while(posicionesAleatorias[2]==posicionesAleatorias[0]||posicionesAleatorias[2]==posicionesAleatorias[1]);
		
		for(int i=0;i<3;i++)
			alumnosAleatorios.add(c1.getGruposAlumnos().get(posicionesAleatorias[i]));

		indices1.add(posicionesAleatorias[0]);
		indices1.add(posicionesAleatorias[1]);
		indices1.add(posicionesAleatorias[2]);
		obtenerIndices(c2,alumnosAleatorios,indices2,indices1);
		cruzarCromosomas(c1,indices1,c2,indices2);	
	}

	private void cruzarCromosomas(CromosomaAlumnos c1,
		LinkedList<Integer> indices1, CromosomaAlumnos c2,
		LinkedList<Integer> indices2) {

		CromosomaAlumnos copia1 = new CromosomaAlumnos(c1);
		LinkedList<Integer> copiaIndices1 = new LinkedList<Integer>();
		LinkedList<Integer> copiaIndices2 = new LinkedList<Integer>();
		copiaIndices1.addAll(indices1);
		copiaIndices2.addAll(indices2);
		
		Collections.sort(copiaIndices1, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				int x =o1;
				int y = o2;
				if(x > y) {
					return -1;
				} 
				else if(x == y) {
					return 0;
				} 
			else {
				return 1;
				}
			}
		});
		Collections.sort(copiaIndices1);
		Collections.sort(copiaIndices2);
		for(int i=0;i<indices1.size();i++){
			c1.getGruposAlumnos().set((int)copiaIndices1.get(i), c2.getGruposAlumnos().get(indices2.get(i)));
		}

		for(int i=0;i<indices2.size();i++){ 
			c2.getGruposAlumnos().set((int)copiaIndices2.get(i), copia1.getGruposAlumnos().get(indices1.get(i)));
		}
	}

	
	
	private void obtenerIndices(CromosomaAlumnos c, ArrayList<Alumno> alumnosAleatorios, LinkedList<Integer> indices,LinkedList<Integer> indices1) {
		for(int j=0;j<alumnosAleatorios.size();j++)
			for(int i=0;i<c.getN();i++){
				if(alumnosAleatorios.get(j).equals(c.getGruposAlumnos().get(i))){
					indices.add(c.getGruposAlumnos().indexOf(alumnosAleatorios.get(j)));
					}
				}
	}	
	

}
